From: Jyrki Gadinger Date: Fri, 25 Jul 2025 10:03:36 +0000 (+0200) Subject: perf(activitylistmodel): store conflicts in separate list X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1^2~13^2^2~3^2 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22Programmet/%22http:/www.example.com/cgi/%22https:/%22Programmet?a=commitdiff_plain;h=f2c3742fea141bd42b5f2ab968965c0ef0da01f6;p=nextcloud-desktop.git perf(activitylistmodel): store conflicts in separate list Figuring out whether a sync conflict occurred by iterating through the entire activity list each time a new activity was added is really slow, even more so when there already are thousands of previous activities. This was especially noticeable during complete initial full syncs involving more than ~5000 files. Signed-off-by: Jyrki Gadinger --- diff --git a/src/gui/tray/activitylistmodel.cpp b/src/gui/tray/activitylistmodel.cpp index 554559b16..a5e7be3de 100644 --- a/src/gui/tray/activitylistmodel.cpp +++ b/src/gui/tray/activitylistmodel.cpp @@ -540,15 +540,13 @@ void ActivityListModel::addEntriesToActivityList(const ActivityList &activityLis beginInsertRows({}, startRow, startRow + activityList.count() - 1); for(const auto &activity : activityList) { _finalList.append(activity); + if (activity._syncFileItemStatus == SyncFileItem::Conflict) { + _conflictsList.push_back(activity); + } } endInsertRows(); - const auto deselectedConflictIt = std::find_if(_finalList.constBegin(), _finalList.constEnd(), [] (const auto &activity) { - return activity._syncFileItemStatus == SyncFileItem::Conflict; - }); - const auto conflictsFound = (deselectedConflictIt != _finalList.constEnd()); - - setHasSyncConflicts(conflictsFound); + setHasSyncConflicts(!_conflictsList.isEmpty()); } void ActivityListModel::accountStateHasChanged() @@ -633,6 +631,10 @@ void ActivityListModel::removeActivityFromActivityList(const Activity &activity) endRemoveRows(); } + if (activity._syncFileItemStatus == SyncFileItem::Conflict) { + _conflictsList.removeOne(activity); + } + if (activity._type != Activity::ActivityType && activity._type != Activity::DummyFetchingActivityType && activity._type != Activity::DummyMoreActivitiesAvailableType && @@ -933,6 +935,7 @@ void ActivityListModel::slotRefreshActivityInitial() void ActivityListModel::slotRemoveAccount() { _finalList.clear(); + _conflictsList.clear(); _activityLists.clear(); _presentedActivities.clear(); setAndRefreshCurrentlyFetching(false); @@ -965,15 +968,7 @@ bool ActivityListModel::hasSyncConflicts() const ActivityList ActivityListModel::allConflicts() const { - auto result = ActivityList{}; - - for(const auto &activity : _finalList) { - if (activity._syncFileItemStatus == SyncFileItem::Conflict) { - result.push_back(activity); - } - } - - return result; + return _conflictsList; } } diff --git a/src/gui/tray/activitylistmodel.h b/src/gui/tray/activitylistmodel.h index 0ac9af94d..b69ed81b7 100644 --- a/src/gui/tray/activitylistmodel.h +++ b/src/gui/tray/activitylistmodel.h @@ -191,6 +191,7 @@ private: ActivityList _notificationLists; ActivityList _listOfIgnoredFiles; ActivityList _notificationErrorsLists; + ActivityList _conflictsList; ActivityList _finalList; QSet _presentedActivities;